/**
 * @file lv_demo_music.c
 * LVGL音乐演示主文件
 */

/*********************
 *      INCLUDE
 *********************/
//导入库
 #include <windows.h>
 #include <stdio.h>
#include <sys/stat.h>
#include <string.h>
#include <errno.h>
//导入自定义头文件
#include "lv_demo_music.h"
#include "lv_demo_music_main.h"
#include "lv_demo_music_list.h"
#include "lrc_parser.h"
#include "utf-8_to_gbk.h"
#include "lv_demo_music_font.h"  // 添加字体头文件
#include "sport.h"
#include "message_popup.h"
#include "mp3_player.h"

/**********************
 *  STATIC VARIABLES
 **********************/
static lv_obj_t * ctrl;        // 主控制界面对象
static lv_obj_t * list;        // 歌曲列表对象


// 歌名列表
char * title_list[MAX_TRACKS] = {0};

// 艺术家列表
char * artist_list[MAX_TRACKS] = {0};

// 音乐流派列表
char * genre_list[MAX_TRACKS] = {0};

// 歌曲时长列表（单位：秒）
uint32_t time_list[MAX_TRACKS] = {0};

// 文件名列表
char * filename_list[MAX_TRACKS] = {0};

// 运动标签列表
char * condition_list[MAX_TRACKS] = {0};

int track_count = 0;

char* soft_base_path = NULL;
char soft_base_path_resource_mp3[1024] = {0};
char soft_base_path_resource_lrc[1024] = {0};



/**********************
 *   GLOBAL FUNCTIONS
 **********************/

/**
 * @brief 音乐演示主函数 - 初始化整个音乐播放器界面
 *
 * 此函数创建音乐播放器的两个主要组件：
 * 1. 歌曲列表界面
 * 2. 播放控制界面
 * 并设置自动播放功能（如果启用）
 */
void lv_demo_music(void)
{
    printf("----------获取工作目录-----------\n");
    char cwd[MAX_PATH];
    if (GetCurrentDirectory(sizeof(cwd), cwd)) {
        soft_base_path = gbk_to_utf8(cwd);
        printf("当前工作目录: %s\n", soft_base_path);
    } else {
        printf("获取工作目录错误: %lu\n", GetLastError());
        return -2;
    }

    printf("----------检测并创建资源目录-----------\n");
    create_resource_directories(utf8_to_gbk(soft_base_path));

    snprintf(soft_base_path_resource_mp3, 1024, "%s\\%s", soft_base_path, "resource\\mp3");
    snprintf(soft_base_path_resource_lrc, 1024, "%s\\%s", soft_base_path, "resource\\lrc");



    printf("----------加载音乐基础数据-----------\n");
    // 首先从LRC文件初始化音乐数据
    track_count = init_music_data_from_lrc(utf8_to_gbk(soft_base_path_resource_lrc));
    if (track_count <= 0) {
        printf("警告：未能加载任何LRC文件，使用默认数据\n");
        track_count += 1;
        title_list[0] = "暂无歌曲";
        artist_list[0] = "暂无歌曲";
        genre_list[0] = "暂无歌曲";
        time_list[0] = 180;
        filename_list[0] = "暂无歌曲";
        condition_list[0] = "暂无歌曲";
    }

    printf("----------MP3播放初始化-----------\n");
    mp3_player_init_engine();

    printf("----------渲染界面-----------\n");
    // 设置屏幕背景颜色为深蓝色
    lv_obj_set_style_bg_color(lv_scr_act(), lv_color_hex(0x343247), 0);
    // 创建歌曲列表界面
    list = _lv_demo_music_list_create(lv_scr_act());
    // 创建主控制界面
    ctrl = _lv_demo_music_main_create(lv_scr_act());


    printf("音乐播放器初始化完成，运动检测已启用\n");

    // 设置自动播放
#if LV_DEMO_MUSIC_AUTO_PLAY
    lv_timer_create(auto_step_cb, 1000, NULL);  // 创建1秒间隔的定时器用于自动演示
#endif
}

/**
 * @brief 根据歌曲ID获取歌曲标题
 * @param track_id 歌曲ID
 * @return 歌曲标题字符串，如果ID无效返回NULL
 */
const char * _lv_demo_music_get_title(uint32_t track_id)
{
    if(track_id >= sizeof(title_list) / sizeof(title_list[0])) return NULL;
    if(track_id < track_count && !title_list[track_id]) {
        return "未知歌曲";
    }
    return title_list[track_id];
}

/**
 * @brief 根据歌曲ID获取艺术家名称
 * @param track_id 歌曲ID
 * @return 艺术家名称字符串，如果ID无效返回NULL
 */
const char * _lv_demo_music_get_artist(uint32_t track_id)
{
    if(track_id >= sizeof(artist_list) / sizeof(artist_list[0])) return NULL;
    if(track_id < track_count &&  !artist_list[track_id]) {
        return "未知歌手";
    }
    return artist_list[track_id];
}

/**
 * @brief 根据歌曲ID获取音乐流派
 * @param track_id 歌曲ID
 * @return 音乐流派字符串，如果ID无效返回NULL
 */
const char * _lv_demo_music_get_genre(uint32_t track_id)
{
    if(track_id >= sizeof(genre_list) / sizeof(genre_list[0])) return NULL;
    if(track_id < track_count &&  !genre_list[track_id]) {
        return "未知流派";
    }
    return genre_list[track_id];
}

/**
 * @brief 根据歌曲ID获取歌曲时长
 * @param track_id 歌曲ID
 * @return 歌曲时长（秒），如果ID无效返回0
 */
uint32_t _lv_demo_music_get_track_length(uint32_t track_id)
{
    if(track_id >= sizeof(time_list) / sizeof(time_list[0])) return 0;
    if(track_id < track_count &&  !time_list[track_id]) {
        return 180;
    }
    return time_list[track_id];
}

/**
 * @brief 根据歌曲ID获取歌曲文件名
 * @param track_id 歌曲ID
 * @return 歌曲文件名，如果ID无效返回NULL
 */
const char * _lv_demo_music_get_filename(uint32_t track_id)
{
    if(track_id >= sizeof(filename_list) / sizeof(filename_list[0])) return NULL;
    if(track_id < track_count &&  !filename_list[track_id]) {
        return "backup_data\\complex_song";
    }
    return filename_list[track_id];
}

/**
 * @brief 根据歌曲ID获取歌曲运动标签
 * @param track_id 歌曲ID
 * @return 歌曲运动标签，如果ID无效返回NULL
 */
const char * _lv_demo_music_get_condition(uint32_t track_id)
{
    if(track_id >= sizeof(condition_list) / sizeof(condition_list[0])) return NULL;
    if(track_id < track_count && !condition_list[track_id]) {
        return "正常";
    }
    return condition_list[track_id];
}

// 创建目录的函数
int create_directory(const char *path) {
    // 检查目录是否已存在
    struct stat st;
    if (stat(path, &st) == 0) {
        if (S_ISDIR(st.st_mode)) {
            printf("目录已存在: %s\n", gbk_to_utf8(path));
            return 0;
        } else {
            printf("路径存在但不是目录: %s\n", gbk_to_utf8(path));
            return -1;
        }
    }

    // 创建目录
    if (mkdir(path) == 0) {
        printf("成功创建目录: %s\n", gbk_to_utf8(path));
        return 0;
    } else {
        printf("创建目录失败 %s: %s\n", gbk_to_utf8(path), strerror(errno));
        return -1;
    }
}

// 主函数：检查并创建所需的目录结构
void create_resource_directories(const char *base_path) {
    char mp3_path[1024];
    char lrc_path[1024];

    // 构建完整路径
    snprintf(mp3_path, sizeof(mp3_path), "%s\\resource\\mp3", base_path);
    snprintf(lrc_path, sizeof(lrc_path), "%s\\resource\\lrc", base_path);

    printf("检查目录结构...\n");
    printf("基础路径: %s\n", gbk_to_utf8(base_path));

    // 创建resource目录（如果不存在）
    char resource_path[1024];
    snprintf(resource_path, sizeof(resource_path), "%s\\resource", base_path);
    if (create_directory(resource_path) != 0) {
        printf("无法创建resource目录，跳过子目录创建\n");
        return;
    }

    // 创建mp3和lrc目录
    create_directory(mp3_path);
    create_directory(lrc_path);
}


